/**
 * @(#)TipoSerializacion.java 1/04/2010
 *
 * Copyright (c) 2005-2010 PsiqueWare S.A. de C.V. All Rights Reserved.
 * This software is the proprietary information PsiqueWare S.A. de C.V.
 * Use is subject to license terms.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
 * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
 * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *
 *
 * <br/>Usuario : AngelElectrico
 * <br/>Creaci&oacute;n: 1/04/2010 - 10:50:35 AM
 * <br/>
 * <br/>
 * <br/><t5>Cambios :</t5>
 * <br/><b>Fecha | Autor  |  Cambios</b>
 * <ul>
 * <li>1/04/2010 | <a href = "mailto:AngelElectrico@PsiqueWare.com">&Aacute;ngel El&eacute;ctrico</a> | Creaci&oacute;n del Objeto.</li>
 *
 * </ul>
 */

package com.psiqueware.alheli.serializacion;

import java.util.ArrayList;
import java.util.List;

/**
 * Tipo para el {@link Serializador}.
 * <br/>Paquete Original: com.psiqueware.alheli.serializacion
 * <br/>Nombre  Original: TipoSerializacion
 * <br/>Oprima para ver : <a href="TipoSerializacion.java.html"><i>C&oacute;digo Fuente</i> </a>
 *
 * @author <a href="mailto:AngelElectrico@PsiqueWare.com">AngelElectrico</a>
 * @version Revision: 1.1 1/04/2010 10:50:35 AM
 * @noinspection StaticVariableOfConcreteClass, StaticVariableNamingConvention, ClassWithoutNoArgConstructor, ClassWithoutLogger, ValueOfIncrementOrDecrementUsed, NonFinalStaticVariableUsedInClassInitialization, MethodReturnOfConcreteClass
 */
public enum TipoSerializacion
{

    XmlEncoder(1L, "TipoSerializacion.XmlEncoder"),
    XmlEncoderHibernate(2L, "TipoSerializacion.XmlEncoderHibernate"),
    XStream(3L, "TipoSerializacion.XStream"),
    XStreamHibernate(4L, "TipoSerializacion.XStreamHibernate"),
    ObjectIOStream(5L, "TipoSerializacion.ObjectIOStream");


    /**
     * Nombre de este TipoSerializacion.
     */
    private String m_nombre;

    /**
     * Identificador &uacute;nico de esta TipoSerializacion.
     * Se utiliza de tipo Long para poder portar esta clase facilmente a un cat&aacute;logo.
     */
    private Long m_id;


    /**
     * Construye un TipoSerializacion a partir de un nombre y un id.
     * <p>Es una enumeraci&oacute;n por lo tanto el constructor es privado.</p>
     *
     * @param id
     * @param name
     */
    private TipoSerializacion(Long id, String name)
    {
        m_nombre = name;
        this.m_id = id;
    }

    /**
     * Convierte este {@link TipoSerializacion} a su representaci&oacute;n textual.
     *
     * @noinspection DuplicateStringLiteralInspection, HardCodedStringLiteral
     */
    public String toString()
    {

        StringBuffer sb = new StringBuffer();
        sb.append("<Instance Class = '").append(this.getClass()).append("'>");
        sb.append("<id>").append(m_id).append("</id>");
        sb.append("<nombre>").append(m_nombre).append("</nombre>");
        sb.append("</Instance>");
        return sb.toString();
    }

    /**
     * Devuelve el identificador textual de este TipoSerializacion.
     *
     * @return String con el nombre.
     */
    public String getNombre()
    {
        return m_nombre;
    }


    /**
     * Devuelve el identificador &uacute;nico de este TipoSerializacion.
     *
     * @return Long con el id.
     */
    public Long getId()
    {
        return m_id;
    }

    /**
     * Devuelve un {@link List} con los {@link TipoSerializacion} de esta enumeraci&oacute;n.
     */
    private static List<TipoSerializacion> m_objects = null;

    /**
     * Devuelve una lista con todos los {@link TipoSerializacion} de la enumeraci&oacute;n.
     *
     * @return nueva List de {@link TipoSerializacion}};
     *
     * @noinspection ReturnOfCollectionOrArrayField
     */
    public static List<TipoSerializacion> listTipoSerializacion()
    {
        if (null == m_objects)
        {
            generaListTipoSerializacion();
        }
        return m_objects;
    }

    /**
     * Genera una lista con todos los {@link TipoSerializacion} de la enumeraci&oacute;n.
     *
     * @return nueva List de {@link TipoSerializacion};
     */
    private static synchronized List<TipoSerializacion> generaListTipoSerializacion()
    {
        if (null == m_objects)
        {
            m_objects = new ArrayList<TipoSerializacion>();
            m_objects.add(XmlEncoder);
            m_objects.add(XmlEncoderHibernate);
            m_objects.add(XStream);
            m_objects.add(XStreamHibernate);
            m_objects.add(ObjectIOStream);
        }
        return m_objects;
    }


    /**
     * Devuelve el TipoSerializacion al que corresponde este id.
     *
     * @param id del TipoSerializacion buscado.
     *
     * @return {@link TipoSerializacion}.
     */
    public static TipoSerializacion desdeId(Long id)
    {
        TipoSerializacion salida = null;
        for (TipoSerializacion obj : listTipoSerializacion())
        {
            if (obj.getId().equals(id))
            {
                salida = obj;
                break;
            }
        }
        return salida;
    }

    /**
     * Devuelve el TipoSerializacion al que corresponde este nombre.
     *
     * @param nombre del TipoSerializacion buscado.
     *
     * @return {@link TipoSerializacion}.
     *
     * @noinspection CallToStringEquals
     */
    public static TipoSerializacion desdeNombre(String nombre)
    {
        TipoSerializacion salida = null;
        for (TipoSerializacion obj : listTipoSerializacion())
        {
            if (obj.getNombre().equals(nombre))
            {
                salida = obj;
                break;
            }
        }
        return salida;
    }

}
